import { randomHexColor } from '../../../../mapUtils/RandomUtil';
import Block from './Block';
import BlockType from './BlockType';
import ImportBlock from './ImportBlock';
import ITool from '../ITool';
import Prefix from '../../constant/Prefix';

/**
 * 控规图工具箱
 * @implements {ITool}
 * @desc
 * 1.用户配置地块CAD相关信息（是否转思极坐标、坐标系、经度、编码）
 * 2.用户点击导入按钮，选择需要导入的CAD文件
 * 3.用户点击上传按钮，上传选择的CAD文件
 * 4.后台解析完成后，前端展示CAD文件内容
 * 5.返回CAD图层信息，提供给用户编辑用地类型
 * 6.用户维护完用地类型，点击保存，调用保存服务，保存用地类型信息
 * 7.返回CAD所有地块信息
 * 8.可以针对某一地块进行编辑（用地属性、用地图形）
 */
class BlockTool extends ITool {
  constructor(_top, _impl) {
    super(_top, _impl);
    this.name = 'BlockTool';
    this.desc = '控规图工具箱';
    this.layeridPrefix = Prefix['BlockTool'];
    this.blockTypeList = BlockType;
    this.defaultStyle = {
      opacity: 0.6,
      'line-color': '#cdd',
      'line-width': 2,
      'line-opacity': 1
    };
    this.instance = null;
    this.importBlock = null;
    this.totalFeatures = [];
  }

  onAdd() {
    super.onAdd();
    this.instance = new Block(this);
    this.importBlock = new ImportBlock(this);
  }

  onRemove() {
    super.onRemove();
  }

  /**
   * 设置用地类型
   * @param {Array} list 用地类型列表
   */
  setBlockTypeList(list) {
    this.blockTypeList = list;
  }

  /**
   * 加载地块
   * @param {features} features 地块图形数据
   * @param {Boolean} fitBound 是否定位
   */
  render(features, fitBound) {
    this.totalFeatures = features;
    features.forEach((feature) => {
      feature.properties.color = this.getBlockColor(feature.properties.ydlx);
      feature.properties = Object.assign(feature.properties, this.defaultStyle);
    });
    this.instance.render(features, fitBound);
  }

  /**
   * 绘制地块
   * @param {*} events 绘制事件
   */
  draw(events) {
    this.instance.draw(events);
  }

  /**
   * 编辑地块
   * @param {feature} feature 地块图形数据
   * @param {*} events 绘制事件
   */
  edit(feature, events) {
    this.instance.edit(feature, events);
  }

  /**
   * 切换地块类型
   * @param {Number} oid 地块Id
   * @param {String} ydlx 用地类型
   */
  changeBlockType(oid, ydlx) {
    let color = this.getBlockColor(ydlx);
    this.instance.changeBlockColor(oid, color);
  }

  /**
   * 清空地块
   */
  clear() {
    this.instance.clear();
  }

  /**
   * 重置地块
   */
  reset() {
    this.instance.reset();
  }

  /**
   * 选择文件
   * @param {*} events 回调事件
   */
  selectFile(events) {
    this.importBlock.selectFile((e) => {
      events.onChangeFile(e);
    });
  }

  /**
   * 上传已选择的文件
   * @param {Object} option 参数
   */
  async doUpload(option) {
    let result = await this.importBlock.doUpload(option);
    return result;
  }

  /**
   * 上传用户自己的文件
   * @param {File} file 文件
   * @param {Object} option 参数
   */
  async uploadFile(file, option) {
    let result = await this.importBlock.uploadFile(file, option);
    return result;
  }

  /**
   * 清除导入图层
   */
  clearImported() {
    this.importBlock.clear();
  }

  /**
   * 切换图层显示状态
   * @param {Array} visibleLayers 显示图层
   */
  changeLayerVisible(visibleLayers) {
    this.importBlock.changeLayerVisible(visibleLayers);
  }

  /**
   * 切换图层类型
   * @param {Array} layers 改变图层
   * @param {String} ydlx 用地类型
   */
  changeLayerType(layers, ydlx) {
    this.importBlock.changeLayerType(layers, ydlx);
  }

  /**
   * 获取用地类型颜色
   * @param {String} code 用地类型编号
   */
  getBlockColor(code) {
    let blockType = this.blockTypeList.find((type) => type.value === code);
    return blockType ? blockType.color : randomHexColor();
  }
}

export default BlockTool;
